package cn.yx.common.core.util;

import cn.hutool.core.util.StrUtil;
import cn.yx.common.core.constant.SeparatorConstant;
import cn.yx.common.core.enums.date.DatePatternEnum;
import cn.yx.common.core.util.date.DateFormatUtil;

import java.time.Instant;
import java.util.UUID;

/**
 * <p>ID工具类</p>
 *
 * @author Wgssmart
 */
public final class IdUtil {

    /**
     * id末尾随机数位数
     */
    public static final int ID_RANDOM_DIGIT = 7;

    private IdUtil() {
    }

    /**
     * 生成带有-的UUID字符串
     *
     * @return 带有-的UUID字符串
     */
    public static String uuid() {
        return UUID.randomUUID().toString();
    }

    /**
     * 生成不带有-的UUID字符串
     *
     * @return 不带有-的UUID字符串
     */
    public static String simpleUuid() {
        return uuid().replace(SeparatorConstant.HYPHEN, StringUtil.EMPTY_STRING);
    }

    /**
     * 以时间和随机数字生成id，时间格式为yyyyMMddHHmmssSSS，随机数字7位，总长度24位
     *
     * @return id字符串
     */
    public static String id() {
        return id(ID_RANDOM_DIGIT);
    }

    /**
     * 以时间和随机数字生成id，时间格式为yyyyMMddHHmmssSSS，末尾添加随机数
     *
     * @param seqDigit 随机数位数
     * @return id字符串
     */
    public static String id(int seqDigit) {
        return id(null, DatePatternEnum.FULL_DATETIME_SIMPLE.getValue(), seqDigit);
    }

    /**
     * 生成指定前缀，指定时间格式，指定后缀的id
     *
     * @param prefix      前缀
     * @param datePattern 时间格式化模式
     * @param suffix      后缀
     * @return id字符串
     */
    public static String id(String prefix, String datePattern, String suffix) {
        return (StrUtil.isNotEmpty(prefix) ? prefix : "")
                + DateFormatUtil.format(Instant.now(), datePattern)
                + (StrUtil.isNotEmpty(suffix) ? suffix : "");
    }

    /**
     * 生成指定前缀，指定时间格式，末尾指定位数的随机数的id
     *
     * @param prefix      前缀
     * @param datePattern 时间格式化模式
     * @param seqDigit    末尾随机数的位数
     * @return id字符串
     */
    public static String id(String prefix, String datePattern, int seqDigit) {
        return id(prefix, datePattern, RandomUtil.randomIntStr(seqDigit));
    }

}
